Python
gao17
2019-10-27
Python
Python
基础
内存
变量类型
占位符
转移符
IO
字典
super和_init_搭配使用
继承:和Java的一致
合成
列表
元祖
字符串
布尔值与空值
elif
while else与for in
turtle
知识点导图
函数
set
迭代器
关键字参数
默认参数
不定长参数
匿名函数
装饰器
偏函数
变量的作用域
异常处理
断言
文件读写
os模块
窗口控制
语音合成
递归
栈队列
时间模块
模块
自定义模块
导入模块部分内容
不执行模块中部分内容
包
第三方模块
面向对象
构造函数
析构函数
单继承
多继承
多态
对象属性和类属性
动态添加属性方法
@property
tkinter
label
button
entry
text
text(滚动条)
checkButton
radioButton
lstbox
Scal
spinBox
Menu顶层菜单
Menu右键菜单
comcobox
Frame
表格
树
布局
绝对布局
相对布局
表格布局
事件
按键事件
响应特殊事件
自动化
读写csv文件
读写pif文件
word自动化
excel自动化
ppt自动化
播放音乐
修改背景图片
键盘模拟
鼠标模拟
p2和p3区别
远程控制
排列
组合
排列组合
正则表达式
元字符
字符串切割
爬虫
模拟浏览器
破解拦截同一个请求头多次请求
设置超时
HTTP请求
json格式数据
抓取ajax请求的数据
糗事百科爬虫
QQ号爬取
网络编程
客户端
服务端
tcp编程
udp编程
模拟飞秋
客户端
服务端
多进程
多任务简介
多任务实现
进程
单任务现象
全局变量不能共享
进程池
进程间通信
多线程
启动多线程
线程间数据共享
线程锁解决多线程数据混乱
多任务
ThreadLocal解决多线程数据混乱
信号量控制线程数量
筹够数量执行
延迟线程
线程通信(阻塞事件触发)
生产者和消费者
线程调度
协程
数据传输
数据库
MongoDB
Redis
数据库
文档
集合
操作数据库
Python操作代码
服务命令
Redis数据类型命令
Python操作代码
Tips
查看是否安装某模块
元祖中可以存放不同类型的数据,因此使用join转字符串时需注意:
在join方法前将元祖中数据类型统一变为str>>>>>>>>>>>>>>>>>>
str="".join([str(i) for i in duple])
Django
虚拟环境
意义
virtualenv
virtualenvwrapper
框架
安装命令
创建虚拟环境
进入(激活)虚拟环境
pip查看安装模块
安装依赖包
退出虚拟环境
创建虚拟环境指定Python版本
安装virtualenvwrapper
创建虚拟环境
切换到某个虚拟环境
退出当前虚拟环境
删除某个虚拟环境
列出所有虚拟环境
进入到虚拟化境所在的目录
修改创建环境默认在用户目录下
创建虚拟环境指定Python版本
安装Django2.1
创建项目
1.通过命令行的方式
2.通过pycharm的方式
tips
修改pip安装源
改变端口号
1.在终端
2.在pycharm中
同局域网中的其他电脑访问本机的项目
1、在终端
2、在pycharm
最后修改`settings.py`文件
项目结构分析
1.manange.py
2.settings.py
3.urls.py
4.wsig.py
django推荐的项目规范
DEBUG模式
1、学前准备
2、URL与视图
URL分发器>
Web.xml
URL映射
URL中添加参数>
Model
运行项目
1.通过命令行的方式
默认首页>index.jsp
URL中包含另外一个urls模块
path函数>
ModelAndVeiw
3、模板>
jsp
渲染模板
模板查找路径配置
DTL模板变量>
域
标签>
jstl
if 标签
for...in... 标签
for...in...empty
with 标签
url 标签>
jsp中URL跳转的Collection
spaceless 标签
autoescape 标签
verbatim 标签
更多标签请参考官方文档: https://docs.djangoproject.com/en/2.0/ref/
templates/builtins/
模板过滤器>
模板变量方法
add
cut
date
default
default_if_none
first
last
floatformat
join
length
lower
upper
random
safe
slice
stringtags
truncatechars
truncatechars_html
模版结构优化
1.引入模版
2.模板继承
加载静态文件
MySQL
MySQL驱动
操作数据库
1.Django配置连接数据库
2.Django中操作数据库
3.Tips
1.ORM模型介绍
2.创建orm模型
3.映射模型到数据库中
ORM模型
4.模型常用属性
5.外键和表关系
一对一
多对多
related_name和related_query_name:
一对多
6.模型的操作
1.添加一个模型到数据库中
2.查找数据
3.查找所有数据
4.数据过滤
5.获取单个对象
6.数据排序
7.修改数据
8.删除数据
9.查询操作
1.exact
2.iexact
3.contains
4.icontains
5.in
6.gt
7.gte
8.lt
9.lte
10.startswith
11.istartswith
12.endswith
13.iendswith
14.range
15.date
16.year
17.month
18.day
19.week_day
20.time
21.isnull
22.regex和iregex
7.聚合函数
1.Avg
2.Count
3.Max 和 Min
4.Sum
5.更多的聚合函数请参考官方文档: https://docs.djangoproject.com/en/2.0/ref/
models/querysets/#aggregation-functions
6.aggregate和annotate的区别
8.F表达式和Q表达式
9.QuerySet API
表单
表单概述
用表单验证数据
常用验证器
ModelForm
7.分组
小结
自己字段则直接使用属性即可,如果是其关联外键的object则使用类名.属性获取
html中options使用超连接
小饭桌系统开发
项目介绍
前端
后端
nvm:管理node.js的工具
node.js:自带有npm包管理工具,为了使用其nvm
npm:类似于Python的pip
gulp:用来自动化开发流程:比如asaa转css,css和js压缩
Python3.6
Django2.0
MySQL
Nvm命令
nvm install node:安装最新的node
nvm install [version]:安装指定版本的node
nvm use[version]:shiyong mouge banbende node
nvm list
nvm uninstall [version]
nvm node_mirror [url]:设置nvm的景象
nvm npm_mirror [url]:设置npm的景象
安装教程(nvm-node-npm-gulp)
npm命令
npm install -g cnpm --registry=https://registry.npm.tao bao.org 安装
cnpm
以后可通过cnpm来代替npm
npm install xx :本地安装 当前项目可以使用 ==》将安装包放./node_modeules
下运行npm命令时所在的目录如果没有node_modules目录,则会在当前目录生成node
——modules
不能通过命令来使用,只能通过require()引入
npm install xx -g 全局安装 所有项目都可使用,
通过命令来使用
通过require()引入本地安装的包==》将安装包放在/usr/local下或者你node的安装
目录
npm uninstall [package] 卸载包
npm update 【package】 更新包
npm search [package] 搜索包
安装gulp
全区安装 -要安装:npm gulp -g
本地安装 -要安装:npm gulp --save-dev
npm init
创建
pom文件
gulp创建任务
创建gulpfile.js在本地项目根目录中
执行任务
创建处理css文件的任务
1.安装gulp-cssnano插件
2.创建js文件执行任务
3.执行任务
css文件重命名
1.安装gulp-rename --save-dev
3.更多教程:https://www.npmjs.com/package/gulp-rename
>>>生成node_modules文件
Lib
2.创建js文件执行任务
Gulp
gulp详解
安装准备
Task
Private tasks:被设计为在内部使用,通常作为 series() 或 parallel() 组合的
组成部分。
Public tasks:将Private tasks导出,可以供gulp命令执行
组合task
series:序列(顺序执行)
parallel:并行(同时执行)
混用:任务间有依赖
输入输出
golb详解
监听文件
gulpfile split
返回值
stream
promise
event emitter
child process
observable
callback
使用 async/await
创建任务
可监控的事件
初次执行
队列
延迟
API
src:读取文件
dest:写入文件
symlink:连接 Vinyl 对象到文件系统
lastRun:当前运行进程中成功完成任务的最后一次时间
series:顺序依次执行
parallel:并发执行
watch:监听
task:不推荐,使用function替代
registry:自定义的注册表插入到任务系统
tree:获取当前任务依赖关系树
vinyl:虚拟的文件格式
vinyl.isVinyl
Vinyl.isCustomProp
Tornado
Flask
npm list --depth=0 查看
__name__属性当当前文件执行时则等于__main__。如果当前文件被引入的时候则等于
模块名
tornado基础
第一个tornado程序
import
tornado.web
'''
tornado的基础web框架模块
'''
import
tornado.ioloop
'''
tornado的核心IO循环模块,封装了Linux的epoll和BSD的kqueue,是tornado高效的基础
'''
# 类比Django中的视图
# 一个业务处理类
class
IndexHandler(tornado.web.RequestHandler):
# 处理get请求的,不能处理post请求
def
get(
self
, *args, **kwargs):
# 对应http请求的方法
# 给浏览器响应信息
self
.write(
"sunck is a good man"
)
if
__name__ ==
"__main__"
:
# 实例化一个app对象
# Application:是tornado web框架的核心应用类,是与服务器对应的接口
# 里面保存了路由映射表,有一个listen方法用来创建一个http服务器的实例,并绑定了端口
app = tornado.web.Application([
(
r"/"
, IndexHandler)
])
# 绑定监听端口
# 注意:此时服务器并没有开启监听
app.listen(
8000
)
'''
IOLoop.current():返回当前线程的IOLoop实例
IOLoop.start():启动IOLoop实例的I/O循环,同时开启了监听
'''
tornado.ioloop.IOLoop.current().start()
高性能原理
以Linux的epoll为例
httpserver
httpserver对象
import
tornado.web
import
tornado.ioloop
# 引入httpserver模块
import
tornado.httpserver
class
IndexHandler(tornado.web.RequestHandler):
def
get(
self
, *args, **kwargs):
self
.write(
"sunck is a good man"
)
if
__name__ ==
"__main__"
:
app = tornado.web.Application([
(
r"/"
, IndexHandler)
])
# app.listen(8000)只能在单进程中使用
#实例化一个http服务器对象
httpServer = tornado.httpserver.HTTPServer(app)
# 绑定端口
httpServer.listen(
8000
)
tornado.ioloop.IOLoop.current().start()
单进程与多进程
注意
tornado服务默认启动的是单进程
开启多个进程
代码示例
import
tornado.web
import
tornado.ioloop
import
tornado.httpserver
class
IndexHandler(tornado.web.RequestHandler):
def
get(self, *args, **kwargs):
self.write(
"sunck is a good man"
)
if
__name__ ==
"__main__"
:
app = tornado.web.Application([
(
r"/"
, IndexHandler)
])
httpServer = tornado.httpserver.HTTPServer(app)
# httpServer.listen(8000)
httpServer.bind(8000)
httpServer.start(5)
tornado.ioloop.IOLoop.current().start()
说明
httpServer.bind(port)
将服务器绑定到指定的端口
httpServer.start(num)
默认开启1个进程
值大于0,创建对应个数个子进程
值为None或者小于等于0,开启对应硬件机器的cup核心数个子进程
补充说明
app.listen()
只能在单进程模式中使用
多进程
虽然tornado给我们提供了一次性启动多个进程的方式,但是由于一些问题,不建议使用上面
方式启动多进程,
而是手动启动多个进程,绑定不同的端口即可解决
问题
每个
子进程都会从父进程中复制一份IOLoop的实例
,如果在创建子进程前修改了IOLoop,会
影响所有的子进程
所有的进程都是由一个命令启动的,无法做到在不停止服务的情况下修改代码
所有进程共享一个端口,想要分别监控很困难
options:动态端口号
tornado为我们提供了一个tornado.options模块
作用
全局参数的定义、存储、转换
基础方法与属性
tornado.options.define()
原型
tornado.options.define(name,
default
=
None
,
type
=
No
ne
,
help
=
None
,
metavar
=
None
,
multiple
=
False
,
group
=
N
one
,
callback
=
None
)
功能
用来定义options选项变量的方法
参数
name
选项变量名,必须保证其唯一性,否则会报"Option 'xxx' already define in ..."
default
设置选项变量的默认值,默认为None
type
设置选项变量的类型,从命令行或配置文件导入参数时tornado会根据类型转换输入的值,转
换不成会报错。可以str,float,int,datetime,timedelta
如果没有设置type,会根据default的值进行转换
如果default没有设置,那么不进行转换
multiple
设置选项变量是否可以为多个值,默认为False
help
选项变量的帮助提示信息
示例
tornado.options.define(
"port"
,
default
=
8000
,
type
=
i
nt
)
tornado.options.define(
"list"
,
default
=[],
type
=
str
)
tornado.options.options
全局的options对象,所有定义的选项变量都会作为该对象的属性
获取命令行参数的方法
tornado.options.parse_command_line():不推荐使用
作用
转换命令行参数,
示例
import
tornado.web
import
tornado.ioloop
import
tornado.httpserver
import
tornado.options
#定义两个参数
tornado.options.define(
"port"
,
default
=
8000
,
type
=
int
)
tornado.options.define(
"list"
,
default
=[],
type
=
str
,
multiple
=
True
)
class
IndexHandler(tornado.web.RequestHandler):
def
get(
self
, *args, **kwargs):
self
.write(
"sunck is a good man"
)
if
__name__ ==
"__main__"
:
# 转换命令行参数,并保存到tornado.options.optrons
tornado.options.parse_command_line()
print
(
"list = "
, tornado.options.options.list)
app = tornado.web.Application([
(
r"/"
, IndexHandler)
])
httpServer = tornado.httpserver.HTTPServer(app)
# 使用变量的值
httpServer.bind(tornado.options.options.port)
httpServer.start(
1
)
tornado.ioloop.IOLoop.current().start()
启动
python server04.py
--port
=9000
--list
=good,nice,handsome,cool
tornado.options.parse_config_file(path)
作用
从配置文件导入参数
代码示例
import
tornado.web
import
tornado.ioloop
import
tornado.httpserver
import
tornado.options
#定义两个参数
tornado.options.define(
"port"
,
default
=
8000
,
type
=
int
)
tornado.options.define(
"list"
,
default
=[],
type
=
str
,
multiple
=
True
)
class
IndexHandler(tornado.web.RequestHandler):
def
get(
self
, *args, **kwargs):
self
.write(
"sunck is a good man"
)
if
__name__ ==
"__main__"
:
tornado.options.parse_config_file(
"config"
)
print
(
"list = "
, tornado.options.options.list)
app = tornado.web.Application([
(
r"/"
, IndexHandler)
])
httpServer = tornado.httpserver.HTTPServer(app)
httpServer.bind(tornado.options.options.port)
httpServer.start(
1
)
tornado.ioloop.IOLoop.current().start()
需要创建一个名为config的普通文件
port = 7000
list =
["good","nice","handsome"]
说明
书写格式仍需要按照python的语法要求
不支持字典类型
最终版本
示例
import
tornado.web
import
tornado.ioloop
import
tornado.httpserver
import
config
class
IndexHandler(tornado.web.RequestHandler):
def
get(
self
, *args, **kwargs):
self
.write(
"sunck is a good man"
)
if
__name__ ==
"__main__"
:
print
(
"list = "
, config.options.list)
app = tornado.web.Application([
(
r"/"
, IndexHandler)
])
httpServer = tornado.httpserver.HTTPServer(app)
httpServer.bind(config.options.port)
httpServer.start(
1
)
tornado.ioloop.IOLoop.current().start()
需要创建一个名为config.py的普通文件
# 参数
options = {
"port"
:
8080
,
"list"
:
[
"good"
,
"nice"
,
"handsome"
]
}
日志
当饿哦们在代码中使用parse_command_line()或者parse_config_file(path)方法时,tornado会
默认开启logging模块功能,向屏幕终端输入一些打印信息
关闭日志
python server04.py --port=9087 --list=good,nice --logging=none
在第一行加入
tornado.options.options.logging =
None
tornado提升
整理基础工程
请看第一天的project工程目录
Application
settings
debug
作用
设置tornado是否工作在调试模式下,默认为False即工作在生产模式下。
True的特性
自动重启
tornado应用会监控源代码文件,当有保存改动时便会重新启动服务器,可以减少手动重启的
次数,提高开发效率。
如果保存后代码有错误会导致重启失败,修改错误后需要手动重启
可以通过autoreload = True单独设置debug四个特性中就自动重启生效
取消缓存编译的模板
可以通过compiled_template_cache = False单独设置
取消缓存静态文件的hash值
可以通过static_hash_cache = False单独设置
提供追踪信息
可以通过serve_traceback=True来单独设置
static_path
设置静态文件目录
template_path
设置模板文件目录
autoescape
当未None时关闭当前项目的自动转义,一般不建议使用
cookie_secret
配置安全cookie秘钥
xsrf_cookies
当为True开启XSRF保护
login_url
用户验证失败会映射该路由
示例
import
os
BASE_DIRS = os.path.dirname(__file__)
#参数
options = {
"port"
:
8000
}
#配置
settings = {
"static_path"
: os.path.join(BASE_DIRS,
"static"
),
"template_path"
: os.path.join(BASE_DIRS,
"templates"
),
"debug"
:
True
}
路由
(
r'/'
, index.IndexHandler)
(
r'/sunck'
, index.SunckHandler, {
"word1"
:
"good"
,
"word2"
:
"nice"
})
class
SunckHandler(RequestHandler):
# 该方法会在HTTP方法之前调用
def
initialize(
self
, word1, word2):
self
.word1 = word1
self
.word2 = word2
def
get(
self
, *args, **kwargs):
print
(
self
.word1,
self
.word2)
self
.write(
"sunck is a nice
man"
)
注意
需要重写initialize方法接收传递的参数
tornado.web.url(
r'/kaige'
, index.KaigeHandler, {
"word3"
:
"handsome"
,
"word4"
:
"cool"
},
name
=
"
index
"
):反向解析使用此代替上面的路由映射
注意
如果使用name属性,不能使用元组路由,需要使用tornado.web.url定义路由
class
KaigeHandler(RequestHandler):
def
initialize(
self
, word3,
word4):
self
.word3 = word3
self
.word4 = word4
def
get(
self
, *args, **kwargs):
print
(
self
.word3,
self
.word4)
self
.write(
"kaige is a nice
man"
)
反向解析
url =
self
.reverse_url(
"kaigegood"
)
self
.write(
"<a href='%s'>去另一个界面</a>"
%(url))
self.reverse_url(
"
index
"
)
会获取到name为"kaigegood"的路由的正则匹配
tornado.web.RequestHandler
利用HTTP协议向服务器传递参数
提取uri的特定部分
http://127.0.0.1:8000/liuyifei/good/nice/handsom
(
r'/liuyifei/(\w+)/(\w+)/(\w+)'
,
index.LiuyifeiHandler)
class
LiuyifeiHandler(RequestHandler):
def
get(
self
, h1, h2, h3, *args,
**kwargs):
print
(h1 +
"-"
+ h2 +
"-"
+ h3)
self
.write(
"liuyifei is a nice
women"
)
(
r'/liuyifei/(?P<p1>\w+)/(?P<p3>\w+)/(?P<p2>\w+)'
,
index.LiuyifeiHandler)
class
LiuyifeiHandler(RequestHandler):
def
get(
self
, p1, p2, p3, *args,
**kwargs):
print
(p1 +
"-"
+ p2 +
"-"
+ p3)
self
.write(
"liuyifei is a nice
women"
)
get方式传递参数
127.0.0.1:8000/zhangmanyu?a=1&b=2&c=3
self.get_query_argument(name,
default
=ARG_DEFAULT,
strip
=
True
)
参数
name
从get请求参数字符串中返回指定参数的值
如果出现过个同名参数,返回最后一个值
default
设置未传的name参数时返回默认的值,如果default也没有设置,会抛出
tornado.web.MissingArgumentError异常
strip
表示是否过滤掉左右两边的空白字符,默认为True过滤
示例
class
ZhangmanyuHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
a =
self
.get_query_argument(
"a"
)
b =
self
.get_query_argument(
"b"
)
c =
self
.get_query_argument(
"c"
,
strip
=
False
)
print
(a, b,
"*"
+c+
"*"
)
self
.write(
"zhangmanyu is a good
women"
)
127.0.0.1:8000/zhangmanyu?a=1&a=2
self.get_query_arguments(name,
strip
=
True
)
参数
示例
class
ZhangmanyuHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
alist =
self
.get_query_arguments(
"a"
)
print
(alist[
0
], alist[
1
])
self
.write(
"zhangmanyu is a good women"
)
post方式传递参数
self.get_body_argument(name,default=ARG_DEFAULT,s
trip=
True
)
self.get_body_arguments(name,strip=
True
)
示例
class
PostFileHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
self
.render(
'postfile.html'
)
def
post(
self
, *args, **kwargs):
name =
self
.get_body_argument(
"username"
)
passwd =
self
.get_body_argument(
"passwd"
)
hobbyList =
self
.get_body_arguments(
"hobby"
)
print
(name, passwd, hobbyList)
self
.write(
"sunck is a handsome man"
)
<!DOCTYPE
html
>
<
html
lang=
"en"
>
<
head
>
<
meta
charset=
"UTF-8"
>
<
title
>Title</
title
>
</
head
>
<
body
>
<
form
action=
"/postfile"
method=
"post"
>
姓名:<
input
type=
"text"
name=
"username"
/>
<
hr
/>
密码:<
input
type=
"password"
name=
"passwd"
/>
<
hr
/>
爱好:
<
input
type=
"checkbox"
value=
"power"
name=
"hobby"
>权利
<
input
type=
"checkbox"
value=
"money"
name=
"hobby"
>金钱
<
input
type=
"checkbox"
value=
"book"
name=
"hobby"
>书
<
input
type=
"submit"
value=
"登陆"
/>
</
form
>
</
body
>
</
html
>
即可以获取get请求,也可以获取post请求
self.get_argument(name,default=ARG_DEFAULT,strip=
True
)
self.get_argument(name,strip=
True
)
注意
一不会选用般
在http报文的头中增加自定义的字段
request对象
作用
存储了关于请求的相关信息
属性
method
HTTP请求的方式
host
被请求的主机名
uri
请求的完整资源地址,包括路径和get查询参数部分
path
请求的路径部分
query
请求参数部分
version
使用的HTTP版本
headers
请求的协议头,是一个字典类型
body
请求体数据
remote_ip
客户端的ip
files
用户上传的文件,字典类型
{
'file': [
{
'filename': 'a.txt',
'body': b'sunck is a good man',
'content_type': 'text/plain'
}
]
}
{
'file': [
{
'filename': 'a.txt',
'body': b'sunck is a good man',
'content_type': 'text/plain'
},
{
'filename': 'b.txt',
'body': b'sunck is a nice man',
'content_type': 'text/plain'
}
]
}
{
'file': [
{
'filename': 'a.txt',
'body': b'sunck is a good man',
'content_type': 'text/plain'
},
{
'filename': 'b.txt',
'body': b'sunck is a nice man',
'content_type': 'text/plain'
}
],
'img': [
{
'filename': 'tornado高效原理图.png',
'body': b'qwertyuiosdghj',
'content_type': 'image/png'
}
]
}
示例
class
ZhuyinHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
print
(
self
.request.method)
print
(
self
.request.host)
print
(
self
.request.uri)
print
(
self
.request.path)
print
(
self
.request.query)
print
(
self
.request.version)
print
(
self
.request.headers)
print
(
self
.request.body)
print
(
self
.request.remote_ip)
print
(
self
.request.files)
self
.write(
"zhuyin is a good women"
)
tornador.httputil.HTTPFile对象
作用
是接收到的文件对象
属性
filename
文件的实际名字
body
文件的数据实体
content_type
文件的类型
示例
import
os
import
config
class
UpFileHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
self
.render(
'upfile.html'
)
def
post(
self
, *args, **kwargs):
filesDict =
self
.request.files
for
inputname
in
filesDict:
fileArr = filesDict[inputname]
for
fileObj
in
fileArr:
# 存储路径
filePath = os.path.join(config.BASE_DIRS,
'upfile/'
+
fileObj.filename)
with
open
(filePath,
"wb"
)
as
f:
f.write(fileObj.body)
self
.write(
"ok"
)
响应输出
write
原型
self.write(chunk)
作用
将chunk数据写到输出缓冲区
基础
class
WriteHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
self
.write(
"sunck is a good man"
)
self
.write(
"sunck is a nice man"
)
self
.write(
"sunck is a handsome
man"
)
#刷新缓冲区,关闭当次请求通道
#在finish下边就不要在write
self
.finish()
self
.write(
"sunck is a cool man"
)
利用write方法写json数据
import
json
class
Json1Handler(RequestHandler):
def
get(
self
, *args, **kwargs):
per = {
"name"
:
"sunck"
,
"age"
:
18
,
"height"
:
175
,
"weight"
:
70
}
#将字典转换成json字符串
jsonStr = json.dumps(per)
self
.write(jsonStr)
手动将字典转成json字符串
class
Json2Handler(RequestHandler):
def
get(
self
, *args, **kwargs):
per = {
"name"
:
"kaige"
,
"age"
:
18
,
"height"
:
175
,
"weight"
:
70
}
self
.write(per)
wirte直接返回字典
注意
自己手动序列化Json方式Content-Type属性值为text/html,而采用write自动序列化方式,
Content-Type属性为application/json
self.set_header(name, value)
作用
手动设置一个名为name,值为value的响应头字段
参数
name
字段名称
value
字段值
示例
import
json
class
Json1Handler(RequestHandler):
def
get(
self
, *args, **kwargs):
per = {
"name"
:
"sunck"
,
"age"
:
18
,
"height"
:
175
,
"weight"
:
70
}
#将字典转换成json字符串
jsonStr = json.dumps(per)
self
.set_header(
"Content-Type"
,
"application/json;
charset=UTF-8"
)
self
.set_header(
"sunck"
,
"good"
)
self
.write(jsonStr)
set_default_headers()
作用
在进入HTTP响应处理方法之前被调用,可以重写该方法来预先设置默认的headers
注意
在HTTP处理方法中使用set_header设置的字段会覆盖set_default_headers()里设置的默认字段的
值
示例
class
HeaderHandler(RequestHandler):
def
set_default_headers(
self
):
self
.set_header(
"Content-Type"
,
"text/html;
charset=UTF-8"
)
self
.set_header(
"kaige"
,
"nice"
)
def
get(
self
, *args, **kwargs):
self
.set_header(
"kaige"
,
"handsome"
)
self
.write(
"good nice"
)
def
post(
self
, *args, **kwargs):
pass
self.set_status(status_code, reason=None)
作用
为响应设置状态码
参数
status_code
状态码值,为int类型。
如果reason的值为None,则状态码必须为正常值
reason
描述状态码的词组,string类型
子主题
class
StatusCodeHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
self
.set_status(
404
)
self
.write(
"*********************
***"
)
class
StatusCodeHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
self
.set_status(
999
,
"who?where?
what?"
)
self
.write(
"************************"
)
class
StatusCodeHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
self
.write(
"**********************
**"
)
self
.set_status(
999
)
报错
重定向 self.redirect(url)
作用
重定向到url网址
示例
class
RedirectHandler(RequestHandler):
def
get(
self
, *args, **kwargs):
self
.redirect(
"/"
)
self.send_error(status_code=500,**kwargs)
作用
抛出HTTP错误状态码,默认为500,抛出错误后tornado会调用wirte_error()方法进行处理,并
返回给浏览器错误界面
注意
在send_error之下就不要在响应输出了
wirte_error(status_code, **kwargs)
作用
用来处理send_error抛出的错误信息,并返回给浏览器错误界面
示例
#错误处理
class
ErrorHandler(RequestHandler):
def
write_error(
self
, status_code, **kwargs):
if
status_code ==
500
:
code =
500
#返回500界面
self
.write(
"服务器内部错误"
)
elif
status_code ==
404
:
code =
404
#返回404界面
self
.write(
"资源不存在"
)
self
.set_status(code)
def
get(
self
, *args, **kwargs):
flag =
self
.get_query_argument(
"flag"
)
print
(
type
(flag))
if
flag ==
'0'
:
self
.send_error(
404
)
self
.write(
"you are right"
)
完整项目构架
Created With
MindMaster